home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / C⁄C++ / Swar / sound.c < prev    next >
Text File  |  1992-09-30  |  3KB  |  130 lines

  1.  
  2. #include <Sound.h>
  3.  
  4. void            AInitSnd (void);
  5. OSErr            ASndPlay (Handle);
  6. void            AStopSnd (void);
  7. Boolean            SndIsPlaying (void);
  8.  
  9. static    SndChannelPtr    gSndChannel0, gSndChannel1, gSndChannel2;
  10. static    Boolean            gSndPlaying0, gSndPlaying1,  gSndPlaying2;
  11. static    SndCommand    myCommand;
  12.  
  13. /*=========================================================*/
  14.  
  15. #define        TRUE   1
  16. #define        FALSE  0
  17. #define        NIL    0
  18.  
  19. void
  20. AInitSnd (void)
  21.  
  22. {
  23.     extern Boolean gSndIsInitted;
  24.     OSErr myErr = 0;
  25.     
  26.     if (!gSndIsInitted) {
  27.     
  28.         gSndChannel0 = (SndChannelPtr) NewPtrClear(sizeof(SndChannel));
  29.         if (gSndChannel0 != nil) {
  30.             gSndChannel0->qLength = stdQLength;
  31.             myErr = SndNewChannel(&gSndChannel0, sampledSynth, initMono+initChanLeft, (ProcPtr) NIL);
  32.         } /* if */
  33.         gSndPlaying0 = FALSE;
  34.         
  35.         gSndChannel1 = (SndChannelPtr) NewPtrClear(sizeof(SndChannel));
  36.         if (gSndChannel1 != nil) {
  37.             gSndChannel1->qLength = stdQLength;
  38.             myErr = SndNewChannel(&gSndChannel1, sampledSynth, initMono+initChanLeft, (ProcPtr) NIL);
  39.         } /* if */
  40.         gSndPlaying1 = FALSE;
  41.         
  42.         gSndChannel2 = (SndChannelPtr) NewPtrClear(sizeof(SndChannel));
  43.         if (gSndChannel2 != nil) {
  44.             gSndChannel2->qLength = stdQLength;
  45.             myErr = SndNewChannel(&gSndChannel2, sampledSynth, initMono+initChanLeft, (ProcPtr) NIL);
  46.         } /* if */
  47.         gSndPlaying2 = FALSE;
  48.         
  49.         gSndIsInitted = TRUE;
  50.     } /* if */
  51.     
  52. } /* AInitSnd() */
  53.  
  54. OSErr
  55. ASndPlay (Handle My_snd_Handle)
  56.  
  57. {
  58.     OSErr                err = noErr;
  59.     extern Boolean        gSoundOn;
  60.     static short            chan;
  61.     
  62.     if (!gSoundOn)
  63.         return;
  64.  
  65.     if ((++chan > 2) || (chan < 0))
  66.         chan = 0;
  67.         
  68.     switch(chan) {
  69.         case 0:
  70.             gSndPlaying0 = FALSE;
  71.             myCommand.cmd = quietCmd;
  72.             err = SndDoImmediate (gSndChannel0, &myCommand);
  73.             if (err == noErr)
  74.             {
  75.                 err = SndPlay (gSndChannel0, My_snd_Handle, TRUE);
  76.                 if (err == noErr)
  77.                 {
  78.                     gSndPlaying0 = TRUE;
  79.                 }
  80.             }
  81.             break;
  82.         case 1:
  83.             gSndPlaying1 = FALSE;
  84.             myCommand.cmd = quietCmd;
  85.             err = SndDoImmediate (gSndChannel1, &myCommand);
  86.             if (err == noErr)
  87.             {
  88.                 err = SndPlay (gSndChannel1, My_snd_Handle, TRUE);
  89.                 if (err == noErr)
  90.                 {
  91.                     gSndPlaying1 = TRUE;
  92.                 }
  93.             }
  94.             break;
  95.         case 2:
  96.             gSndPlaying2 = FALSE;
  97.             myCommand.cmd = quietCmd;
  98.             err = SndDoImmediate (gSndChannel2, &myCommand);
  99.             if (err == noErr)
  100.             {
  101.                 err = SndPlay (gSndChannel2, My_snd_Handle, TRUE);
  102.                 if (err == noErr)
  103.                 {
  104.                     gSndPlaying2 = TRUE;
  105.                 }
  106.             }
  107.             break;
  108.     } /* switch */
  109.     return (err);
  110. }
  111.     
  112. void
  113. AStopSnd (void)
  114.  
  115. {
  116.     extern Boolean gSndIsInitted;
  117.     OSErr myErr = 0;
  118.     
  119.     if (gSndIsInitted) {
  120.         myErr = SndDisposeChannel (gSndChannel0, TRUE);
  121.         gSndPlaying0 = FALSE;
  122.         myErr = SndDisposeChannel (gSndChannel1, TRUE);
  123.         gSndPlaying1 = FALSE;
  124.         myErr = SndDisposeChannel (gSndChannel2, TRUE);
  125.         gSndPlaying2 = FALSE;
  126.         gSndIsInitted = FALSE;
  127.     } /* if */
  128.  
  129. } /* AStopSnd() */
  130.